/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package espe.ccsoft.dao;

import espe.ccsoft.models.Permiso;
import espe.ccsoft.orm.ORMBase;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author misahaelfernandez
 */
public class PermisoDao extends ORMBase<Permiso> {

    public final void insert(final Permiso permiso) throws SQLException, Exception {
        // Sentencia SQL para realizar la consulta a la BD:
        permiso.setEstado(true);
        permiso.setFecha_creacion(new java.sql.Timestamp(new java.util.Date().getTime()));
        permiso.setVisible(true);

        if (!permiso.getVista().isEmpty() && !permiso.getControlador().isEmpty()) {
            permiso.setComando("/" + permiso.getControlador() + "/" + permiso.getVista());
        }

        super.insertSql = "INSERT INTO PERMISO ("
                + "PERM_NOMBRE,"
                + "PERM_VISTA,"
                + "PERM_CONTROLADOR,"
                + "PERM_COMANDO,"
                + "PERM_PADRE,"
                + "PERM_FECHACREACION,"
                + "PERM_VISIBLE,"
                + "PERM_ESTADO"
                + ") VALUES(?, ?, ?, ?, ?, ?, ?, ?)";
        super.insert(new Object[]{
            permiso.getNombre(),
            permiso.getVista(),
            permiso.getControlador(),
            permiso.getComando(),
            permiso.getId_padre(),
            permiso.getFecha_creacion(),
            permiso.isVisible(),
            permiso.isEstado(),});
    }

    public final void update(final Permiso permiso) throws SQLException, Exception {
        // Sentencia SQL para realizar la consulta a la BD:
        super.updateSql = "UPDATE PERMISO SET "
                + "PERM_NOMBRE=?, "
                + "PERM_PADRE= ?, "
                + "PERM_VISIBLE=?, "
                + "PERM_ESTADO=? "
                + "WHERE PERM_ID=?";
        super.update(new Object[]{
            permiso.getNombre(),
            permiso.getId_padre(),
            permiso.isVisible(),
            permiso.isEstado(),
            permiso.getId(),});
    }

    public final Permiso findByPK(final int id_permiso) throws SQLException, Exception {
        // Sentencia SQL para realizar la consulta a la BD:
        super.findByPkSql = "select * FROM PERMISO"
                + " WHERE PERM_ID=?";
        return super.findByPK(new Object[]{
            id_permiso,});
    }

    public final Permiso findByNombre(final String nombre) throws SQLException, Exception {
        // Sentencia SQL para realizar la consulta a la BD:
        super.findByPkSql = "SELECT * FROM PERMISO"
                + " WHERE PERM_NOMBRE = ? AND "
                + "PERM_ESTADO=1";
        return super.findByPK(new Object[]{
            nombre,});
    }

    public final List<Permiso> findAllByNombre(final String nombre) throws SQLException, Exception {
        // Sentencia SQL para realizar la consulta a la BD:
        super.findSomeSql = "SELECT * FROM PERMISO"
                + " WHERE (PERM_NOMBRE LIKE ?) AND "
                + "PERM_ESTADO=1";
        return super.findSome(new Object[]{
            nombre,});
    }

    public final List<Permiso> findAllPadre() throws Exception {
        super.findAllSql = "SELECT * FROM PERMISO WHERE PERM_ESTADO=1 AND PERM_PADRE IS NULL";
        return super.findAll();
    }

    public final List<Permiso> findByRolPadres(final int rol_id) throws SQLException, Exception {
        // Sentencia SQL para realizar la consulta a la BD:
        super.findSomeSql = "SELECT perm.PERM_ID, perm.PERM_NOMBRE, perm.PERM_COMANDO, "
                + "perm.PERM_PADRE, perm.PERM_VISTA, perm.PERM_CONTROLADOR, "
                + "perm.PERM_VISIBLE, perm.PERM_FECHACREACION, perm.PERM_ESTADO "
                + "FROM PERMISO AS perm, PERMISOS_ROL AS perm_rol, ROL AS r "
                + "WHERE perm.PERM_ID=perm_rol.PERM_ID "
                + "AND perm_rol.ROL_ID=r.ROL_ID "
                + "AND perm.PERM_PADRE IS NULL "
                + "AND r.ROL_ID=? "
                + "AND perm.PERM_VISIBLE "
                + "AND perm.PERM_ESTADO";
        return super.findSome(new Object[]{
            rol_id,}) == null ? new ArrayList<>() : super.findSome(new Object[]{
            rol_id,});
    }

    public final List<Permiso> findByRolHijos(final int id_rol, final int id_padre) throws SQLException, Exception {
        // Sentencia SQL para realizar la consulta a la BD:
        super.findSomeSql = "SELECT perm.PERM_ID, perm.PERM_NOMBRE, perm.PERM_VISTA, "
                + "perm.PERM_CONTROLADOR, perm.PERM_COMANDO, perm.PERM_PADRE, "
                + "perm.PERM_VISIBLE, perm.PERM_FECHACREACION, perm.PERM_ESTADO "
                + "FROM PERMISO AS perm, PERMISOS_ROL AS perm_rol, ROL AS r "
                + "WHERE perm.PERM_ID=perm_rol.PERM_ID "
                + "AND perm_rol.ROL_ID=r.ROL_ID "
                + "AND r.ROL_ID=? "
                + "AND perm.PERM_PADRE=? "
                + "AND perm.PERM_PADRE IS NOT NULL "
                + "AND perm.PERM_VISIBLE "
                + "AND perm.PERM_ESTADO "
                + "ORDER BY perm.PERM_NOMBRE";
        return super.findSome(new Object[]{
            id_rol,
            id_padre,})== null ? new ArrayList<>() : super.findSome(new Object[]{
            id_rol,
            id_padre,});
    }

    public final List<Permiso> findByUsuario(final int id_usuario) throws SQLException, Exception {
        // Sentencia SQL para realizar la consulta a la BD:
        super.findSomeSql = "SELECT perm.PERM_ID, perm.PERM_NOMBRE, perm.PERM_VISTA, "
                + "perm.PERM_CONTROLADOR, perm.PERM_COMANDO, perm.PERM_PADRE,"
                + "perm.PERM_VISIBLE, perm.PERM_FECHACREACION, perm.PERM_ESTADO "
                + "FROM PERMISO AS perm, PERMISOS_ROL AS perm_rol, USUARIO as usu "
                + "WHERE perm.PERM_ID=perm_rol.PERM_ID "
                + "AND usu.ROL_ID=perm_rol.ROL_ID "
                + "AND usu.USU_ID=? "
                + "AND perm.PERM_VISIBLE "
                + "AND perm.PERM_ESTADO";
        return super.findSome(new Object[]{
            id_usuario,});
    }

    public final List<Permiso> findByRol(final int id_rol) throws SQLException, Exception {
        // Sentencia SQL para realizar la consulta a la BD:
        super.findSomeSql = "SELECT perm.PERM_ID, perm.PERM_NOMBRE, perm.PERM_VISTA, "
                + "perm.PERM_CONTROLADOR, perm.PERM_COMANDO, perm.PERM_PADRE,"
                + "perm.PERM_VISIBLE, perm.PERM_FECHACREACION, perm.PERM_ESTADO "
                + "FROM PERMISO AS perm, PERMISOS_ROL AS perm_rol, ROL as rol "
                + "WHERE perm.PERM_ID=perm_rol.PERM_ID "
                + "AND rol.ROL_ID=perm_rol.ROL_ID "
                + "AND rol.ROL_ID=? "
                + "AND perm.PERM_VISIBLE "
                + "AND perm.PERM_ESTADO";
        return super.findSome(new Object[]{
            id_rol,});
    }

    @Override
    public final List<Permiso> findAll() throws SQLException, Exception {
        // Sentencia SQL para realizar la consulta a la BD:
        super.findAllSql = "SELECT * FROM PERMISO WHERE PERM_ESTADO=1";
        return super.findAll();
    }

    @Override
    protected Permiso crearObjeto(final ResultSet rs) throws SQLException {
        Permiso permiso = new Permiso();
        permiso.setId(rs.getInt("PERM_ID"));
        permiso.setNombre(rs.getString("PERM_NOMBRE"));
        permiso.setControlador(rs.getString("PERM_CONTROLADOR"));
        permiso.setVista(rs.getString("PERM_VISTA"));
        permiso.setComando(rs.getString("PERM_COMANDO"));
        permiso.setId_padre(rs.getInt("PERM_PADRE"));
        permiso.setVisible(rs.getBoolean("PERM_VISIBLE"));
        permiso.setFecha_creacion(rs.getTimestamp("PERM_FECHACREACION"));
        permiso.setEstado(rs.getBoolean("PERM_ESTADO"));
        return permiso;
    }
}
